package practice.Day2;

import java.util.Scanner;

/**
 * @Author quan
 * @Description 倒置字符串：将一句话的单词进行倒置，标点不倒置。I like beijing. 变为 beijing. like I
 * @Date 2023/5/9 17:10
 */
public class Num2_reverseWord {
    /**
     * 自己写的，一直报错，也没找到问题。简单的语句可以实现，但是复杂的下面的就报错。
     */
//    public static void main(String[] args) {
//        Scanner sc = new Scanner(System.in);
//        String s = sc.nextLine();
////        String s = "Im like beijing.";
////        String s = "taking address of temporary array in expansion of macro \"av_err2str\"";
//        //1、将字符串转化为数组
//        char[] arr = s.toCharArray();
//        //2、对整个数组进行逆序
//        reverse(arr,0,arr.length-1);
//        for (int i = 0; i < arr.length; i++) {
//            System.out.print(arr[i]);
//        }
//        System.out.println();
//        //3、找到单词，记录每个单词的开始位置和结束位置
//        int i = 0;
//        for (int j = 0; j < arr.length;) {
//            if(j != arr.length-1 && arr[j] == ' '){
//                //4、对每个单词进行逆序
//                reverse(arr,i,j-1);
//                i = j+1;
//
//            }
//            j++;
//            if(j == arr.length-1 ){
//                reverse(arr,i,j);
//            }
//
//        }
//        for (int k = 0; k < arr.length; k++) {
//            System.out.print(arr[k]);
//        }
//    }
//
//    public static void reverse(char[] arr, int start, int end) {
//        //注意：这里的mid计算的时候要+start。start = 10,end = 16.mid = ((16-10)/2)+10=13
//        int mid = ((end-start)/2)+start;
//        for (int k = start; k <= mid;) {
//            for (int l = end; l > mid;) {
//                swap(arr,k,l);
//                k++;
//                l--;
//            }
//        }
//    }
//
//    private static void swap(char[] arr, int i, int j) {
//        char temp = arr[i];
//        arr[i] = arr[j];
//        arr[j] = temp;
//    }
    /**
     * 答案：
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        //1、将输入的字符串转为字符数组
        char[] arr = str.toCharArray();
        //2、对整个字符串进行逆序：调用reverse函数
        reverse(arr,0,str.length()-1);
        //3、对整个字符数组进行遍历：i表示子字符串的开始位置，j记录的是结束位置
        int i = 0;
        while (i < arr.length){
            //更新j值
            int j = i;
            //4、找到第一个空格位置
            while (j < arr.length && arr[j] != ' '){
                j++;
            }
            //5、如果此时j还没遍历完
            if(j < arr.length){
                //6、反转子字符串
                reverse(arr,i,j-1);
                //7、更新新的i值
                i = j+1;
            }
            //8、否则已经走到最后一个子字符串,反转即可
            else{
                reverse(arr,i,j-1);
                //此时更新i值。要更新，不然就又进入了while循环
                i = j;
            }
        }
        //9、输出最终结果
        String str1 = new String(arr);
        System.out.println(str1);
    }

    /**
     * 逆序函数
     * @param arr 要逆序的字符数组
     * @param start 数组的开始索引位置
     * @param end 数组的结束索引位置
     */
    private static void reverse(char[] arr, int start, int end) {
        while (start < end){
             char temp = arr[start];
             arr[start] = arr[end];
             arr[end] = temp;
             start++;
             end--;
        }
    }
}
